home *** CD-ROM | disk | FTP | other *** search
- unit HexViewer;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- StdCtrls, ComCtrls, RegValet, Menus;
-
- type
- TfrmHexViewer = class(TForm)
- reData: TRichEdit;
- lblFileName: TLabel;
- rvJeeves: TRegValet;
- mmMain: TMainMenu;
- miFile: TMenuItem;
- miExit: TMenuItem;
- miOpen: TMenuItem;
- miOptions: TMenuItem;
- miSmallFont: TMenuItem;
- miNormalFont: TMenuItem;
- miLargeFont: TMenuItem;
- miSep2: TMenuItem;
- mi16CharsPerLine: TMenuItem;
- mi32CharsPerLine: TMenuItem;
- miSep1: TMenuItem;
- miFile0: TMenuItem;
- miFile1: TMenuItem;
- miFile2: TMenuItem;
- miFile3: TMenuItem;
- miFile4: TMenuItem;
- miFile5: TMenuItem;
- miFile6: TMenuItem;
- miFile7: TMenuItem;
- miFile8: TMenuItem;
- miFile9: TMenuItem;
- odOpen: TOpenDialog;
- procedure FormShow(Sender: TObject);
- procedure ExitClick(Sender: TObject);
- procedure FileOpenClick(Sender: TObject);
- procedure FontSizeClick(Sender: TObject);
- procedure FormClose(Sender: TObject; var Action: TCloseAction);
- procedure HistFileListClick(Sender: TObject);
- procedure CharsPerLineClick(Sender: TObject);
- procedure SetFileMenuItems(Sender: TObject);
- private
- CurrFile: String;
- FontSize: Integer;
- CharsPerLine: Integer;
- private
- procedure InitializeFromRegistry;
- procedure LoadFile(const FileName: String);
- procedure SetMenuItemChecks;
- public
- end;
-
- var
- frmHexViewer: TfrmHexViewer;
-
- implementation
-
- {$R *.DFM}
-
- const
- SMALL_FONT_SIZE = 8;
- NORMAL_FONT_SIZE = 10;
- LARGE_FONT_SIZE = 12;
-
- FILE_HISTORY = 'FileHistory';
- FONT_SIZE = 'FontSize';
- CHARS_PER_LINE = 'CharsPerLine';
-
- { Format routine }
-
- procedure FormatFile(MS: TMemoryStream; CharsPerLine: Integer;
- Lines: TStrings);
- const
- HexChar: array[0..15] of Char =
- ('0', '1', '2', '3', '4', '5', '6', '7',
- '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
- var
- I: Integer;
- J: Integer;
- Offset: Integer;
- PC: PChar;
- BH: Byte;
- BL: Byte;
- OutS: String[116];
- OffsetS: String[8];
- HexS: String[64];
- CharS: String[32];
-
- procedure FormatLine(Offset: Integer);
- var
- I: Integer;
- begin
- OffSetS := Format('%8.8x', [Offset]);
- if Length(HexS) < (CharsPerLine * 2) then
- HexS := HexS + StringOfChar(' ',
- ((CharsPerLine * 2) - Length(HexS)));
- OutS := OffsetS + ' ' + Copy(HexS, 1, 8) + ' ' +
- Copy(HexS, 9, 8) + ' ' + Copy(HexS, 17, 8) + ' ' +
- Copy(HexS, 25, 8) + ' ';
- if CharsPerLine = 32 then
- OutS := OutS + Copy(HexS, 33, 8) + ' ' +
- Copy(HexS, 41, 8) + ' ' + Copy(HexS, 49, 8) + ' ' +
- Copy(HexS, 57, 8) + ' ';
- for I := 1 to CharsPerLine do
- begin
- if not (Ord(CharS[I]) in [32..127]) then
- CharS[I] := '.';
- end;
- OutS := OutS + CharS;
- end;
-
- begin
- Lines.Clear;
- Lines.BeginUpdate;
- I := 0;
- J := 0;
- Offset := 0;
- PC := MS.Memory;
- HexS := '';
- CharS := '';
- while (I < MS.Size) do
- begin
- while True do
- begin
- Inc(J);
- if (J = (CharsPerLine + 1)) or (I = MS.Size) then
- begin
- FormatLine(Offset);
- try
- Lines.Add(OutS);
- except
- ShowMessage('File too big for display control - ' +
- 'full file contents not available for display');
- Lines.EndUpdate;
- Exit;
- end;
- Inc(Offset, CharsPerLine);
- J := 0;
- HexS := '';
- CharS := '';
- Break;
- end;
- if I < MS.Size then
- begin
- BH := Ord(PC^);
- BL := BH;
- BH := BH shr 4;
- BL := BL mod 16;
- HexS := HexS + HexChar[BH] + HexChar[BL];
- CharS := CharS + PC^;
- Inc(I);
- Inc(PC);
- end;
- end;
- end;
- Lines.EndUpdate;
- end;
-
- { TfrmHexViewer }
-
- procedure TfrmHexViewer.CharsPerLineClick(Sender: TObject);
- begin
- if (Sender = mi16CharsPerLine) and (CharsPerLine = 32) then
- begin
- CharsPerLine := 16;
- LoadFile(CurrFile);
- end
- else if (Sender = mi32CharsPerLine) and (CharsPerLine = 16) then
- begin
- CharsPerLine := 32;
- LoadFile(CurrFile);
- end;
- SetMenuItemChecks;
- rvJeeves[CHARS_PER_LINE] := IntToStr(CharsPerLine);
- end;
-
- procedure TfrmHexViewer.ExitClick(Sender: TObject);
- begin
- Close;
- end;
-
- procedure TfrmHexViewer.FileOpenClick(Sender: TObject);
- begin
- if odOpen.Execute then
- LoadFile(odOpen.FileName);
- end;
-
- procedure TfrmHexViewer.FontSizeClick(Sender: TObject);
- begin
- if Sender = miSmallFont then
- FontSize := SMALL_FONT_SIZE
- else if Sender = miNormalFont then
- FontSize := NORMAL_FONT_SIZE
- else if Sender = miLargeFont then
- FontSize := LARGE_FONT_SIZE;
- rvJeeves[FONT_SIZE] := IntToStr(FontSize);
- SetMenuItemChecks;
- reData.Font.Size := FontSize;
- end;
-
- procedure TfrmHexViewer.FormClose(Sender: TObject;
- var Action: TCloseAction);
- begin
- rvJeeves.SaveFormBounds;
- end;
-
- procedure TfrmHexViewer.FormShow(Sender: TObject);
- begin
- InitializeFromRegistry;
- SetMenuItemChecks;
- reData.Font.Size := FontSize;
- end;
-
- procedure TfrmHexViewer.HistFileListClick(Sender: TObject);
- begin
- LoadFile((Sender as TMenuItem).Caption);
- end;
-
- procedure TfrmHexViewer.InitializeFromRegistry;
- var
- Size: String;
- begin
- rvJeeves.RestoreFormBounds;
- CharsPerLine := 16;
- if rvJeeves[CHARS_PER_LINE] = '32' then
- CharsPerLine := 32;
- Size := rvJeeves[FONT_SIZE];
- if Size = '' then
- Size := IntToStr(NORMAL_FONT_SIZE);
- FontSize := StrToInt(Size);
- end;
-
- procedure TfrmHexViewer.LoadFile(const FileName: String);
- var
- MS: TMemoryStream;
- begin
- if FileName <> '' then
- begin
- MS := TMemoryStream.Create;
- try
- try
- MS.LoadFromFile(FileName);
- except
- rvJeeves.DeleteIndexedValue(FILE_HISTORY, FileName);
- raise;
- end;
- FormatFile(MS, CharsPerLine, reData.Lines);
- CurrFile := FileName;
- lblFileName.Caption := CurrFile;
- rvJeeves.MoveIndexedValueToFront(FILE_HISTORY, CurrFile);
- finally
- MS.Free;
- end;
- end;
- end;
-
- procedure TfrmHexViewer.SetFileMenuItems(Sender: TObject);
- var
- Cnt: Integer;
-
- procedure SetMenuItem(Index: Integer; Item: TMenuItem);
- begin
- Item.Visible := (Index < Cnt);
- if Index < Cnt then
- begin
- Item.Caption := rvJeeves.IndexedValues[FILE_HISTORY, Index];
- if Item.Caption = CurrFile then
- Item.Visible := False;
- end;
- end;
-
- begin
- Cnt := rvJeeves.Count[FILE_HISTORY];
- SetMenuItem(0, miFile0);
- SetMenuItem(1, miFile1);
- SetMenuItem(2, miFile2);
- SetMenuItem(3, miFile3);
- SetMenuItem(4, miFile4);
- SetMenuItem(5, miFile5);
- SetMenuItem(6, miFile6);
- SetMenuItem(7, miFile7);
- SetMenuItem(8, miFile8);
- SetMenuItem(9, miFile9);
- miSep1.Visible := (miFile0.Visible or miFile1.Visible);
- end;
-
- procedure TfrmHexViewer.SetMenuItemChecks;
- begin
- miSmallFont.Checked := (FontSize = SMALL_FONT_SIZE);
- miNormalFont.Checked := (FontSize = NORMAL_FONT_SIZE);
- miLargeFont.Checked := (FontSize = LARGE_FONT_SIZE);
- mi16CharsPerLine.Checked := (CharsPerLine = 16);
- mi32CharsPerLine.Checked := (CharsPerLine = 32);
- end;
-
- end.
-
-
-